package avicit.bdp.dms.das.dao;

import avicit.bdp.common.base.BaseDAO;
import avicit.bdp.common.service.dto.BdpTableDTO;
import avicit.bdp.dms.das.vo.TableInfoVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @金航数码科技有限责任公司
 * @作者：developer
 * @邮箱：developer@avic-digital.com
 * @创建时间： 2020-06-24 14:54
 * @类说明：bdp_das_tableDao
 * @修改记录：
 */
public interface BdpDasTableDao extends BaseDAO<BdpTableDTO> {
	/**
	 * 查询模型列表
	 *
	 * @param type        类型：0--全域建模；1--数据开发平台项目建模；2--数据字典;4--逻辑模型; 5--物理模型
	 * @param typeIdList  分类ID集合
	 * @param keyWords    关键词
	 * @return 表数据
	 */
	Page<BdpTableDTO> queryTableList(@Param("type") Integer type,
									 @Param("layerId") String layerId,
									 @Param("typeIdList") List<String> typeIdList,
									 @Param("keyWords") String keyWords,
									 @Param("status") Integer status,
									 @Param("wordSecretList") List<String> wordSecretList);

	/**
	 * 查询总数据量
	 *
	 * @return 总数据量
	 */
	Long selectCountAll();

	/**
	 * 添加项目空间表管理关系
	 *
	 * @param id           id
	 * @param projectId    项目空间ID
	 * @param tableId      模型表ID
	 * @param typeId       分类ID
	 * @param userId       用户ID
	 * @param userIp       用户IP
	 * @param creationDate 创建日期
	 * @param orgId        组织ID
	 */
	void insertProjectTable(@Param("id") String id,
							@Param("projectId") String projectId,
							@Param("tableId") String tableId,
							@Param("typeId") String typeId,
							@Param("userId") String userId,
							@Param("userIp") String userIp,
							@Param("creationDate") Date creationDate,
							@Param("orgId") String orgId);

	/**
	 * 删除模型表
	 *
	 * @param projectId 项目空间ID
	 * @param tableId   模型表ID
	 */
	void deleteProTable(@Param("projectId") String projectId,
						@Param("tableId") String tableId);

	/**
	 * 项目空间模型列表查询
	 *
	 * @param typeIds   分类集合
	 * @param projectId 项目空间ID
	 * @param keyWords  关键词
	 * @return 模型列表
	 */
	Page<BdpTableDTO> getListForModel(@Param("typeIds") List<String> typeIds,
									  @Param("projectId") String projectId,
									  @Param("keyWords") String keyWords,
									  @Param("wordSecretList") List<String> wordSecretList);

	/**
	 * 查询导入表总数
	 *
	 * @param projectId 项目空间ID
	 * @param tableId   表ID
	 * @param typeIds   分类集合
	 * @return 导入表总数
	 */
	Integer selectImported(@Param("projectId") String projectId,
						   @Param("tableId") String tableId,
						   @Param("typeIds") List<String> typeIds);

	/**
	 * 查询被导入的表
	 *
	 * @param projectId 项目空间ID
	 * @return 导入的表
	 */
	List<BdpTableDTO> selectListByProjectId(@Param("projectId") String projectId);

	/**
	 * 查询空间下面导入数据源中的表
	 *
	 * @param projectId    projectId
	 * @param typeIds      分类ID集合
	 * @param dbType       数据库类型
	 * @param type         模型类型
	 * @param dataSourceId dataSourceId
	 * @return 表名集合
	 */
	List<BdpTableDTO> selectTableList(@Param("projectId") String projectId,
									  @Param("typeIds") List<String> typeIds,
									  @Param("type") Integer type,
									  @Param("dbType") String dbType,
									  @Param("storeStatus") Integer storeStatus,
									  @Param("dataSourceId") String dataSourceId);

	/**
	 * 将模型name_old字段置空
	 *
	 * @param tableId 模型id
	 */
	void updateTableNameOldNull(@Param("tableId") String tableId);

	/**
	 * 根据typeId获取所有表与bdp_das_catalog表关联
	 *
	 * @param typeId 分类ID
	 * @return 获取所有表与bdp_das_catalog表关联
	 */
	List<BdpTableDTO> getTableListByTypeId(@Param("typeId") String typeId);

	/**
	 * 通过分类ID和小写表名统计模型数
	 *
	 * @param typeId 分类ID
	 * @param name   小写表明
	 * @return 模型数
	 */
	List<BdpTableDTO> selectByNameAndTypeId(@Param("typeId") String typeId,
											@Param("name") String name,
											@Param("type") Integer type);

	/**
	 * 根据type id 统计导入的模型数
	 * @param typeId 分类ID
	 * @return 模型数
	 */
	int countTableByTypeId(@Param("typeId") String typeId);


	/**
	 * 根据type id 统计导入的模型数
	 * @param typeId 分类ID
	 * @return 模型数
	 */
	int selectMaxYByTypeId(@Param("typeId") String typeId);

	/**
	 * 项目空间模型列表查询
	 *
	 * @param typeIds   分类集合
	 * @param projectId 项目空间ID
	 * @return 模型列表
	 */
	List<BdpTableDTO> getTableList(@Param("typeIds") List<String> typeIds, @Param("projectId") String projectId);

	/**
	 * 查询是否为工作台的表
	 *
	 * @param	modelId
	 * @return int
	 *
	 * @author felix
	 * @date 2021/12/20 17:18
	 */
	int selectProjectCount(@Param("modelId") String modelId);

	Integer getMaxY(@Param("typeId") String categoryId);

	Integer getMaxHeigh(@Param("typeId") String categoryId);

	List<String> selectDBTypeList();

	void updateProjectTableTypeId(@Param("projectId") String projectId, @Param("tableId") String tableId, @Param("typeId") String typeId);

	String selectTyprIdByTableAndProject(@Param("tableId") String tableId, @Param("projectId") String projectId);

	List<TableInfoVO> qureyTablesByTypeId(@Param("typeId") String typeId,
										  @Param("type") Integer type,
										  @Param("wordSecretList") List<String> wordSecretList);

	/**
	 * 数据授权时，根据授权角色获取具有数据查看权限的模型表
	 * @param roleIdList 授权角色
	 * @param keyWords 关键字
	 * @param action
	 * @return
	 */
	List<BdpTableDTO> getTableListByRole(@Param("roleIdList") List<String> roleIdList,
										 @Param("keyWords") String keyWords,
										 @Param("action") Integer action);

	List<String> getProjectNamesByTableId(@Param("tableId") String tableId);

	List<BdpTableDTO> selectTableByProjectAndTypeId(@Param("tableName") String tableName,
													@Param("projectId") String projectId,
													@Param("typeId") String typeId);

	Page<BdpTableDTO> searchImportPhysicalList(List<String> typeIdList, String sourceTypeId, String keyWords);

	Page<BdpTableDTO> searchImportMetaDataList(String datasourceId, String sourceTypeId, String keyWords);

	Page<BdpTableDTO> searchImportMetaDatas(String datasourceId, String keyWords);

	List<BdpTableDTO> selectExportList(List<String> typeIdList, List<String> idList);
}
